package com.ibm.cloud.envcheck.kit;

/*     */ 
/*     */ import java.lang.reflect.AccessibleObject;
/*     */ import java.lang.reflect.Constructor;
/*     */ import java.lang.reflect.Field;
/*     */ import java.lang.reflect.InvocationHandler;
/*     */ import java.lang.reflect.Method;
/*     */ import java.lang.reflect.Modifier;
/*     */ import java.lang.reflect.Proxy;
/*     */ import java.util.Arrays;
/*     */ import java.util.LinkedHashMap;
/*     */ import java.util.Map;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public class Reflect
/*     */ {
/*     */   private final Object object;
/*     */   private final boolean isClass;
/*     */   
/*     */   public static Reflect on(String name)
/*     */     throws ReflectException
/*     */   {
/*  85 */     return on(forName(name));
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public static Reflect on(Class<?> clazz)
/*     */   {
/*  99 */     return new Reflect(clazz);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public static Reflect on(Object object)
/*     */   {
/* 112 */     return new Reflect(object);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public static <T extends AccessibleObject> T accessible(T accessible)
/*     */   {
/* 123 */     if (accessible == null) {
/* 124 */       return null;
/*     */     }
/*     */     
/* 127 */     if (!accessible.isAccessible()) {
/* 128 */       accessible.setAccessible(true);
/*     */     }
/*     */     
/* 131 */     return accessible;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private Reflect(Class<?> type)
/*     */   {
/* 154 */     object = type;
/* 155 */     isClass = true;
/*     */   }
/*     */   
/*     */   private Reflect(Object object) {
/* 159 */     this.object = object;
/* 160 */     isClass = false;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public <T> T get()
/*     */   {
/* 175 */     return (T)object;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public Reflect set(String name, Object value)
/*     */     throws ReflectException
/*     */   {
/*     */     try
/*     */     {
/* 197 */       Field field = type().getField(name);
/* 198 */       field.set(object, unwrap(value));
/* 199 */       return this;
/*     */     }
/*     */     catch (Exception e1)
/*     */     {
/*     */       try {
/* 204 */         ((Field)accessible(type().getDeclaredField(name))).set(object, unwrap(value));
/* 205 */         return this;
/*     */       } catch (Exception e2) {
/* 207 */         throw new ReflectException(e2);
/*     */       }
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public <T> T get(String name)
/*     */     throws ReflectException
/*     */   {
/* 229 */     return (T)field(name).get();
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public Field getDeclaredField(Class<?> clazz, String name)
/*     */     throws NoSuchFieldException
/*     */   {
/* 243 */     Field field = null;
/* 244 */     while (clazz != Object.class) {
/*     */       try {
/* 246 */         field = clazz.getDeclaredField(name);
/* 247 */         if (field != null)
/*     */           break;
/*     */       } catch (Exception e) {
/* 250 */         clazz = clazz.getSuperclass();
/*     */       }
/*     */     }
/* 253 */     if (field == null) {
/* 254 */       throw new NoSuchFieldException("name is not found");
/*     */     }
/* 256 */     return field;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public Reflect field(String name)
/*     */     throws ReflectException
/*     */   {
/*     */     try
/*     */     {
/* 276 */       Field field = type().getField(name);
/* 277 */       return on(field.get(object));
/*     */     }
/*     */     catch (Exception e1)
/*     */     {
/*     */       try {
/* 282 */         return on(((Field)accessible(getDeclaredField(type(), name))).get(object));
/*     */       } catch (Exception e2) {
/* 284 */         throw new ReflectException(e2);
/*     */       }
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public Map<String, Reflect> fields()
/*     */   {
/* 303 */     Map<String, Reflect> result = new LinkedHashMap();
/*     */     
/* 305 */     for (Field field : type().getFields()) {
/* 306 */       if ((!isClass ^ Modifier.isStatic(field.getModifiers()))) {
/* 307 */         String name = field.getName();
/* 308 */         result.put(name, field(name));
/*     */       }
/*     */     }
/*     */     
/* 312 */     return result;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public Reflect call(String name)
/*     */     throws ReflectException
/*     */   {
/* 329 */     return call(name, new Object[0]);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public Reflect call(String name, Object... args)
/*     */     throws ReflectException
/*     */   {
/* 369 */     Class<?>[] types = types(args);
/*     */     
/*     */ 
/*     */     try
/*     */     {
/* 374 */       Method method = exactMethod(name, types);
/* 375 */       return on(method, object, args);
/*     */ 
/*     */     }
/*     */     catch (NoSuchMethodException e)
/*     */     {
/*     */       try
/*     */       {
/* 382 */         Method method = similarMethod(name, types);
/* 383 */         return on(method, object, args);
/*     */       } catch (NoSuchMethodException e1) {
/* 385 */         throw new ReflectException(e1);
/*     */       }
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private Method exactMethod(String name, Class<?>[] types)
/*     */     throws NoSuchMethodException
/*     */   {
/* 398 */     Class<?> type = type();
/*     */     
/*     */     try
/*     */     {
/* 402 */       return type.getMethod(name, types);
/*     */     }
/*     */     catch (NoSuchMethodException e) {}
/*     */     
/*     */ 
/* 407 */     return type.getDeclaredMethod(name, types);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private Method similarMethod(String name, Class<?>[] types)
/*     */     throws NoSuchMethodException
/*     */   {
/* 419 */     Class<?> type = type();
/*     */     
/*     */ 
/*     */ 
/* 423 */     for (Method method : type.getMethods()) {
/* 424 */       if (isSimilarSignature(method, name, types)) {
/* 425 */         return method;
/*     */       }
/*     */     }
/*     */     
/*     */ 
/* 430 */     for (Method method : type.getDeclaredMethods()) {
/* 431 */       if (isSimilarSignature(method, name, types)) {
/* 432 */         return method;
/*     */       }
/*     */     }
/*     */     
/* 436 */     throw new NoSuchMethodException("No similar method " + name + " with params " + Arrays.toString(types) + " could be found on type " + type() + ".");
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private boolean isSimilarSignature(Method possiblyMatchingMethod, String desiredMethodName, Class<?>[] desiredParamTypes)
/*     */   {
/* 446 */     return (possiblyMatchingMethod.getName().equals(desiredMethodName)) && (match(possiblyMatchingMethod.getParameterTypes(), desiredParamTypes));
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public Reflect create()
/*     */     throws ReflectException
/*     */   {
/* 461 */     return create(new Object[0]);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public Reflect create(Object... args)
/*     */     throws ReflectException
/*     */   {
/* 490 */     Class<?>[] types = types(args);
/*     */     
/*     */ 
/*     */     try
/*     */     {
/* 495 */       Constructor<?> constructor = type().getDeclaredConstructor(types);
/* 496 */       return on(constructor, args);
/*     */ 
/*     */     }
/*     */     catch (NoSuchMethodException e)
/*     */     {
/*     */ 
/* 502 */       for (Constructor<?> constructor : type().getConstructors()) {
/* 503 */         if (match(constructor.getParameterTypes(), types)) {
/* 504 */           return on(constructor, args);
/*     */         }
/*     */       }
/*     */       
/* 508 */       throw new ReflectException(e);
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public <P> P as(Class<P> proxyType)
/*     */   {
/* 521 */     final boolean isMap = object instanceof Map;
/* 522 */     InvocationHandler handler = new InvocationHandler()
/*     */     {
/*     */       public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
/*     */       {
/* 526 */         String name = method.getName();
/*     */         
/*     */         try
/*     */         {
/* 530 */           return Reflect.on(object).call(name, args).get();
/*     */ 
/*     */         }
/*     */         catch (ReflectException e)
/*     */         {
/* 535 */           if (isMap) {
/* 536 */             Map<String, Object> map = (Map)object;
/* 537 */             int length = args == null ? 0 : args.length;
/*     */             
/* 539 */             if ((length == 0) && (name.startsWith("get")))
/* 540 */               return map.get(Reflect.property(name.substring(3)));
/* 541 */             if ((length == 0) && (name.startsWith("is")))
/* 542 */               return map.get(Reflect.property(name.substring(2)));
/* 543 */             if ((length == 1) && (name.startsWith("set"))) {
/* 544 */               map.put(Reflect.property(name.substring(3)), args[0]);
/* 545 */               return null;
/*     */             }
/*     */           }
/*     */           
/* 549 */           throw e;
/*     */         }
/*     */         
/*     */       }
/* 553 */     };
/* 554 */     return (P)Proxy.newProxyInstance(proxyType.getClassLoader(), new Class[] { proxyType }, handler);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */   private static String property(String string)
/*     */   {
/* 561 */     int length = string.length();
/*     */     
/* 563 */     if (length == 0)
/* 564 */       return "";
/* 565 */     if (length == 1) {
/* 566 */       return string.toLowerCase();
/*     */     }
/* 568 */     return string.substring(0, 1).toLowerCase() + string.substring(1);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private boolean match(Class<?>[] declaredTypes, Class<?>[] actualTypes)
/*     */   {
/* 580 */     if (declaredTypes.length == actualTypes.length) {
/* 581 */       for (int i = 0; i < actualTypes.length; i++) {
/* 582 */         if (!wrapper(declaredTypes[i]).isAssignableFrom(wrapper(actualTypes[i]))) {
/* 583 */           return false;
/*     */         }
/*     */       }
/*     */       
/* 587 */       return true;
/*     */     }
/* 589 */     return false;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public int hashCode()
/*     */   {
/* 598 */     return object.hashCode();
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   public boolean equals(Object obj)
/*     */   {
/* 606 */     if ((obj instanceof Reflect)) {
/* 607 */       return object.equals(((Reflect)obj).get());
/*     */     }
/*     */     
/* 610 */     return false;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   public String toString()
/*     */   {
/* 618 */     return object.toString();
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private static Reflect on(Constructor<?> constructor, Object... args)
/*     */     throws ReflectException
/*     */   {
/*     */     try
/*     */     {
/* 630 */       return on(((Constructor)accessible(constructor)).newInstance(args));
/*     */     } catch (Exception e) {
/* 632 */       throw new ReflectException(e);
/*     */     }
/*     */   }
/*     */   
/*     */   private static Reflect on(Method method, Object object, Object... args)
/*     */     throws ReflectException
/*     */   {
/*     */     try
/*     */     {
/* 641 */       accessible(method);
/*     */       
/* 643 */       if (method.getReturnType() == Void.TYPE) {
/* 644 */         method.invoke(object, args);
/* 645 */         return on(object);
/*     */       }
/* 647 */       return on(method.invoke(object, args));
/*     */     }
/*     */     catch (Exception e) {
/* 650 */       throw new ReflectException(e);
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */   private static Object unwrap(Object object)
/*     */   {
/* 658 */     if ((object instanceof Reflect)) {
/* 659 */       return ((Reflect)object).get();
/*     */     }
/*     */     
/* 662 */     return object;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private static Class<?>[] types(Object... values)
/*     */   {
/* 671 */     if (values == null) {
/* 672 */       return new Class[0];
/*     */     }
/*     */     
/* 675 */     Class<?>[] result = new Class[values.length];
/*     */     
/* 677 */     for (int i = 0; i < values.length; i++) {
/* 678 */       Object value = values[i];
/* 679 */       result[i] = (value == null ? Object.class : value.getClass());
/*     */     }
/*     */     
/* 682 */     return result;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */   private static Class<?> forName(String name)
/*     */     throws ReflectException
/*     */   {
/*     */     try
/*     */     {
/* 692 */       return Class.forName(name);
/*     */     } catch (Exception e) {
/* 694 */       throw new ReflectException(e);
/*     */     }
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public Class<?> type()
/*     */   {
/* 704 */     if (isClass) {
/* 705 */       return (Class)object;
/*     */     }
/* 707 */     return object.getClass();
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   public static Class<?> wrapper(Class<?> type)
/*     */   {
/* 715 */     if (type == null)
/* 716 */       return null;
/* 717 */     if (type.isPrimitive()) {
/* 718 */       if (Boolean.TYPE == type)
/* 719 */         return Boolean.class;
/* 720 */       if (Integer.TYPE == type)
/* 721 */         return Integer.class;
/* 722 */       if (Long.TYPE == type)
/* 723 */         return Long.class;
/* 724 */       if (Short.TYPE == type)
/* 725 */         return Short.class;
/* 726 */       if (Byte.TYPE == type)
/* 727 */         return Byte.class;
/* 728 */       if (Double.TYPE == type)
/* 729 */         return Double.class;
/* 730 */       if (Float.TYPE == type)
/* 731 */         return Float.class;
/* 732 */       if (Character.TYPE == type)
/* 733 */         return Character.class;
/* 734 */       if (Void.TYPE == type) {
/* 735 */         return Void.class;
/*     */       }
/*     */     }
/*     */     
/* 739 */     return type;
/*     */   }
/*     */ }

/* Location:           /Users/macky/icm/workspace/com.ibm.cloud.envcheck/lib/jfinal-ext-3.1.2.jar
 * Qualified Name:     com.jfinal.ext.kit.Reflect
 * Java Class Version: 6 (50.0)
 * JD-Core Version:    0.7.1
 */